/**
 * 给一个树，节点有两种颜色，定义边的权值为：
 * 两个子树的连通块数量之差的绝对值
 * 求所有边权之和
 * 做一个树形DP，Bi表示i子树蓝色连通块的数量
 * Ri表示红色的数量
 * 于是可以知道TotalR和TotalB
 * 再遍历一遍边，对每一条边，可以直接知道儿子的连通块数量
 * 另一边的连通块数量可以根据总数与儿子数算得
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

int const SZ = 200000 + 10;

char S[SZ];

int N;
vvi G;

vi R, B, D;
vi Father;

void dfs(int u, int p){
    Father[u] = p;
    const char ch = S[u];
    if('R' == ch) R[u] = 1;
    else if('B' == ch) B[u] = 1;

    for(auto v : G[u]){
        if(v == p) continue;
        dfs(v, u);

        if(S[v] != ch) {
            R[u] += R[v];
            B[u] += B[v];
        }else if(ch == 'R'){
            R[u] += R[v] - 1;
            B[u] += B[v];
        }else{
            B[u] += B[v] - 1;
            R[u] += R[v];
        }
    }
    D[u] = B[u] + R[u];
    return;
}

llt proc(){
    Father.assign(N + 1, 0);
    R.assign(N + 1, 0);
    B.assign(N + 1, 0);
    D.assign(N + 1, 0);
    dfs(1, 0);

    llt ans = 0;
    int totalr = R[1], totalb = B[1];
    for(int i=1;i<=N;++i){
        const char ch = S[i];
        for(auto v : G[i]){
            if(v == Father[i]) continue;
            int leftr = totalr - R[v];
            int leftb = totalb - B[v];
            if(ch == S[v]){
                if(ch == 'R') leftr += 1;
                else leftb += 1;
            }

            ans += abs(D[v] - (leftr + leftb));
        }
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> S + 1;
        G.assign(N + 1, {});
        for(int a,b,i=1;i<N;++i){
            cin >> a >> b;
            G[a].push_back(b);
            G[b].push_back(a);
        }
        cout << proc() << "\n";
    }
    return 0;
}